package org.xx.armory.db;

/**
 * SQL参数构造器。
 */
public interface ParameterBuilder {
    /**
     * 设置参数类型，如果未设置，那么默认类型是{@link ParameterType#STRING}
     *
     * @param type
     *         参数类型。
     * @return 参数构造器本身。
     */
    ParameterBuilder setType(ParameterType type);

    /**
     * 设置参数值的长度，如果未设置，那么默认长度是参数值的文本形式的长度。
     *
     * @param size
     *         参数值的长度。
     * @return 参数构造器本身。
     */
    ParameterBuilder setSize(int size);

    /**
     * 设置参数匹配方式，如果未设置，那么默认匹配方式是完全匹配。
     *
     * @param match
     *         参数匹配方式。
     * @return 参数构造器本身。
     */
    ParameterBuilder setMatch(MatchType match);

    /**
     * 设置若干参数传入传出方式，如果未设置，那么默认方式是传入。
     *
     * @param directions
     *         若干参数传入传出方式
     * @return 参数构造器本身。
     */
    ParameterBuilder setDirections(ParameterDirection... directions);

    /**
     * 设置参数值，如果未设置，那么默认值是{@code null}。
     *
     * @param value
     *         参数值。
     * @return 参数构造器本身。
     */
    ParameterBuilder setValue(Object value);

    /**
     * 构造SQL参数, 根据当前所有已设置的参数来构造SQL参数。
     *
     * @return 已构造的SQL参数。
     */
    Parameter build();

    /**
     * 构造SQL参数并加入到Session中，然后返回创建参数构造器的会话。
     * <p>此方法用于实现链式操作，允许在链式操作中返回{@code Session}的引用，然后创建下一个参数构造器。</p>
     *
     * @return 创建参数构造器的会话。
     */
    Session then();
}
